"""
配置管理接口定义
================

定义配置管理器的抽象基类，确保不同配置实现的一致性。
"""

from abc import ABC, abstractmethod
from typing import Dict, Any, Optional, Union, List
from pathlib import Path


class AbstractConfigManager(ABC):
    """
    配置管理器抽象基类
    
    定义配置加载、获取、验证等核心功能的接口契约。
    """
    
    @abstractmethod
    def load_config(self, service_name: str) -> Dict[str, Any]:
        """
        加载指定服务的配置
        
        Args:
            service_name: 服务名称
            
        Returns:
            Dict[str, Any]: 配置字典
        """
        pass
    
    @abstractmethod
    def get_config(self, service_name: str, key: Optional[str] = None) -> Any:
        """
        获取配置值
        
        Args:
            service_name: 服务名称
            key: 配置键，如果为None则返回整个配置
            
        Returns:
            Any: 配置值
        """
        pass
    
    @abstractmethod
    def set_config(self, service_name: str, key: str, value: Any) -> None:
        """
        设置配置值
        
        Args:
            service_name: 服务名称
            key: 配置键
            value: 配置值
        """
        pass
    
    @abstractmethod
    def reload_config(self, service_name: Optional[str] = None) -> None:
        """
        重新加载配置
        
        Args:
            service_name: 服务名称，如果为None则重载所有配置
        """
        pass
    
    @abstractmethod
    def validate_config(self, service_name: str) -> bool:
        """
        验证配置的有效性
        
        Args:
            service_name: 服务名称
            
        Returns:
            bool: 配置是否有效
        """
        pass
    
    @abstractmethod
    def get_database_config(self, service_name: str) -> Dict[str, Any]:
        """
        获取数据库配置
        
        Args:
            service_name: 服务名称
            
        Returns:
            Dict[str, Any]: 数据库配置
        """
        pass
    
    @abstractmethod
    def get_redis_config(self, service_name: str) -> Dict[str, Any]:
        """
        获取Redis配置
        
        Args:
            service_name: 服务名称
            
        Returns:
            Dict[str, Any]: Redis配置
        """
        pass
    
    @abstractmethod
    def get_jwt_config(self, service_name: str) -> Dict[str, Any]:
        """
        获取JWT配置
        
        Args:
            service_name: 服务名称
            
        Returns:
            Dict[str, Any]: JWT配置
        """
        pass
    
    @abstractmethod
    def list_services(self) -> List[str]:
        """
        列出所有可用的服务配置
        
        Returns:
            List[str]: 服务名称列表
        """
        pass
    
    @abstractmethod
    def get_config_path(self, service_name: str) -> Optional[Path]:
        """
        获取配置文件路径
        
        Args:
            service_name: 服务名称
            
        Returns:
            Optional[Path]: 配置文件路径
        """
        pass
